package com.example.demo.database.services.base;

import com.example.demo.database.services.mysql.MySqlCompiler;

import java.util.ArrayList;
import java.util.List;

public interface SqlCompiler {
    String create(String tableName, SqlGenerator generator);

    String dropIfExists(String tableName);

    interface ColumnGenerator {

        /**
         * 用于在数据表中创建一个自增的 UNSIGNED BIGINT 类型（主键）的列
         *
         * @param name
         * @return
         */
        Column bigIncrements(String name);

        /**
         * 用于在数据表中创建一个自增的 UNSIGNED BIGINT 类型（主键）的列
         *
         * @return
         */
        Column bigIncrements();

        /**
         * 用于在数据表中创建一个自增的 UNSIGNED BIGINT 类型（主键）的列
         *
         * @param name
         * @return
         */
        Column id(String name);

        /**
         * 用于在数据表中创建一个自增的 UNSIGNED BIGINT 类型（主键）的列
         *
         * @return
         */
        Column id();

        /**
         * 用于在数据表中创建一个INTEGER的列
         *
         * @return
         */
        Column integer(String name);

        /**
         * 创建一个TIMESTAMP列
         *
         * @param name
         * @return
         */
        Column timestamp(String name);

        /**
         * 创建创建时间和更新时间列
         */
        void timestamps();

        /**
         * 创建删除时间列
         */
        void softDeletes();

        /**
         * 创建一个给定长度的 VARCHAR
         *
         * @param name
         * @return
         */
        Column string(String name, int length);

        /**
         * 创建一个给定长度的 VARCHAR
         *
         * @param name
         * @return
         */
        Column string(String name);

        /**
         * 创建一个给定长度的 LONGTEXT
         *
         * @param name
         * @return
         */
        Column longtext(String name);
    }

    interface Column {
        String getCompileString();

        /**
         * 设置 INTEGER 类型的列为自动递增 (主键)
         *
         * @return
         */
        Column autoIncrement();

        /**
         * 允许 NULL 值插入到该列
         */
        Column nullable();

        /**
         * 允许 NULL 值插入到该列
         */
        Column nullable(boolean nullable);

        /**
         * 为该列指定一个「默认值」
         *
         * @param cDefault
         */
        Column cDefault(String cDefault);

        /**
         * 为该列添加注释
         *
         * @param comment
         */
        Column comment(String comment);
    }
}
